package IHM;

import java.awt.Desktop;
import java.awt.Menu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;
import javax.swing.filechooser.FileNameExtensionFilter;

import Metier.Projet;

/**
 * Classe gerant de la barre de menu(MenuBar)
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */
public class MenuBar implements ActionListener{

	/**
	 * Permet de contenir l'instance de l'IHM de l'application
	 */
	private IHM ihm;
	
	/**
	 * Bouton permetant de sauvegarder, de creer un nouveau projet, 
	 * generer le projet, supprimer, importer, exporter, ouvrir
	 * @see MenuBar#activerBoutons(boolean)
	 * @see MenuBar#activerGenerer(boolean)
	 */
	private JButton save,newProjet,newPage,saveAll,supprime,importe,export,ouvrir;
	
	/**
	 * Constructeur de la classe MenuBar
	 * @param ihm	l'instance de l'IHM
	 */
	public MenuBar(IHM ihm) {
		this.ihm = ihm;
		
		
		/*******************/
		/* Toolbar d'icone */
		/*******************/
		
		JToolBar jtb_menuBar = new JToolBar();
		jtb_menuBar.setFloatable(false);
	
		/* bouton nouveau projet */
		newProjet = new JButton(new ImageIcon(getClass().getResource("/images/newProjet.png")));
		newProjet.setBorderPainted(false);
		newProjet.setToolTipText("Nouveau Projet");
		newProjet.addActionListener(this);
		
		/* bouton nouvelle page */
		newPage = new JButton(new ImageIcon(getClass().getResource("/images/newPage.png")));
		newPage.setBorderPainted(false);
		newPage.setToolTipText("Nouvelle Page");
		newPage.addActionListener(this);
		newPage.setEnabled(false);
		
		/* bouton de suppression*/
		supprime = new JButton(new ImageIcon(getClass().getResource("/images/supprime.png")));
		supprime.setBorderPainted(false);
		supprime.setToolTipText("Supprime la page ou le projet selon l'élément selectionné dans l'arborescence");
		supprime.addActionListener(this);
		supprime.setEnabled(false);
		
		/* bouton de sauvegarde */
		save=new JButton(new ImageIcon(getClass().getResource("/images/enregistrer.png")));
		save.setBorderPainted(false);
		save.setToolTipText("Sauvegarder");
		save.addActionListener(this);
		
		/* bouton pour générer toutes les pages xml d'un projet*/
		saveAll=new JButton(new ImageIcon(getClass().getResource("/images/exporterTout.png")));
		saveAll.setBorderPainted(false);
		saveAll.setToolTipText("Générer toutes les pages d'un projet");
		saveAll.addActionListener(this);
		saveAll.setEnabled(!ihm.getControleur().getProjets().isEmpty());
		
		/* bouton pour exporter un projet*/
		export=new JButton(new ImageIcon(getClass().getResource("/images/export.png")));
		export.setBorderPainted(false);
		export.setToolTipText("Exporter un projet");
		export.addActionListener(this);
		export.setEnabled(!ihm.getControleur().getProjets().isEmpty());
		
		/* bouton pour importer un projet*/
		importe=new JButton(new ImageIcon(getClass().getResource("/images/import.png")));
		importe.setBorderPainted(false);
		importe.setToolTipText("Importer un projet");
		importe.addActionListener(this);
		
		/* bouton pour ouvrir le dossier contenant les projets */
		ouvrir=new JButton(new ImageIcon(getClass().getResource("/images/ouvrir.png")));
		ouvrir.setBorderPainted(false);
		ouvrir.setToolTipText("Ouvrir le dossier contenant les projets");
		ouvrir.addActionListener(this);
		
		jtb_menuBar.add(newProjet);
		jtb_menuBar.add(newPage);
		jtb_menuBar.add(supprime);
		jtb_menuBar.add(save);
		jtb_menuBar.add(saveAll);
		jtb_menuBar.add(ouvrir);
		jtb_menuBar.add(export);
		jtb_menuBar.add(importe);

		ihm.add(jtb_menuBar,"North");
	}
	
	/**
	 * Permet d'activer ou desactiver le bouton generer
	 * @param b	vrai(true) pour activer sinon faux(false)
	 */
	public void activerGenerer(boolean b){
		saveAll.setEnabled(b);
		export.setEnabled(b);
	}
	
	/**
	 * Permet d'activer ou desactiver les bouton supprimer ou nouvelle page
	 * @param b	vrai(true) pour activer sinon faux(false)
	 */
	public void activerBoutons(boolean b){
		supprime.setEnabled(b);
		newPage.setEnabled(b);
	}

	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()==newProjet){
			new FenetreSaisie("Projet",ihm);
		}
		else if(e.getSource()==save){
			ihm.getControleur().sauvegarde();
		}
		else if(e.getSource()== newPage){
			new FenetreSaisie("Page",ihm);
		}
		else if(e.getSource()==saveAll){
			String choix[]=new String[ihm.getControleur().getProjets().size()];
			int i=0;
			for(Projet p:ihm.getControleur().getProjets()){
				choix[i]=p.getNom();
				i++;
			}
			String res;
			if(ihm.getControleur().getProjetEnCours()==null)
				res =(String) JOptionPane.showInputDialog(ihm, "Selectionnez un projet","Generer Pages XML",JOptionPane.YES_NO_CANCEL_OPTION,new ImageIcon(getClass().getResource("/images/modalGenerer.png")),choix,choix[0]);
			else
				res =(String) JOptionPane.showInputDialog(ihm, "Selectionnez un projet","Generer Pages XML",JOptionPane.YES_NO_CANCEL_OPTION,new ImageIcon(getClass().getResource("/images/modalGenerer.png")),choix,ihm.getControleur().getProjetEnCours().getNom());
			if(res!=null){	
				String nomFichier;
				i=ihm.getControleur().getProjetByNom(res).genererTout();
			
				if(i==0)
					ihm.setInfo("Aucune page XML présente dans le projet selectionné !");
				else if(i==1)
					ihm.setInfo(i+" page XML générée !");
				else 
					ihm.setInfo(i+" pages XML générées !");
			}
		}
		else if(e.getSource()==supprime){
			if(ihm.getArborescence().getSelectedNoeud()==2){
				ihm.getArborescence().supprimer(ihm.getControleur().getProjetEnCours().getNom(), ihm.getControleur().getProjetEnCours().getPageEnCours().getTitrePage());
			}
			else if(ihm.getArborescence().getSelectedNoeud()==1){
					ihm.getArborescence().supprimer(ihm.getControleur().getProjetEnCours().getNom());
			}
		}
		else if(e.getSource()==importe){
			JFileChooser jfc=new JFileChooser();
			jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
			int rVal=jfc.showDialog(ihm, "Importer");
			
			if(rVal==JFileChooser.APPROVE_OPTION){
				if(!ihm.getControleur().importerProjet(jfc.getSelectedFile())){
					JOptionPane.showMessageDialog(ihm, "Impossible d'importer le projet sélectionné !");
				}
				else
					ihm.majArbre();
				
			}
			
		}
		else if(e.getSource()==export){
			new FenetreExport(ihm);
		}
		else if(e.getSource()==ouvrir){
			ouvrirDossier();
		}
	}
	
	public void ouvrirDossier(){
		if(System.getProperty("os.name").contains("Windows") || System.getProperty("os.name").contains("Mac") ){
			Desktop desk=Desktop.getDesktop();
			try {
				desk.open(ihm.getControleur().getRacine());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				System.out.println(e);
			}
		}
		else if(System.getProperty("os.name").contains("Linux")){
			ProcessBuilder builder = new ProcessBuilder("xdg-open",ihm.getControleur().getRacine().getPath());
			try {
				builder.start();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				System.out.println(e1);
			}
		}
	}
	
}
